#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : recursion_demo.py
# @Time : 2023/7/3 15:44
# -------------------------------

"""
什么情况下可以使用递归：
1. 一个问题可以拆分成子问题。
2.这些问题求解思路相同，数据规模不同。
3.拥有明确的终止条件。
# 数学公式：求阶乘、斐波那契数列、汉诺塔小程序
# 二分查找。
# 快速排序。
# 二叉树的遍历。

"""
'''递归组成部分--
基线条件：函数不再调用自己
递归条件：函数调用自己
'''
# 实例，一个正整数的阶乘是所有小于即等于该数的正整数的积，
# 并且0的阶乘为1。自然数n的阶乘写作n!。即为 :n! = 1*2*3*4*...*(n-1)*n

def factorial(n):
    # 基线条件（结束条件）
    if n == 1:
        return 1
    # 递归条件：函数调用自己
    # 如果在递归过程中，**问题**没有被分解，则回不停的递归下去。
    # 如何解决：让n在每一次调用的过程中，都变小
    factorial(n-1)


def test_factorial():
    assert factorial(1) == 1
    assert factorial(2) == 2
    assert factorial(3) == 6
    assert factorial(4) == 24

